package com.bw1806.cart.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bw1806.pojo.Cart;
import com.bw1806.pojo.TType;
import com.bw1806.pojo.TbBrand;
import com.bw1806.service.TbBrandService;
import com.bw1806.utils.CookieUtil;
import com.bw1806.utils.SecutityUtils;
import com.github.pagehelper.StringUtil;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

/**
 * @描述
 * @创建人 wangyue
 * @创建时间2020/11/2415:30
 */
@RestController
@RequestMapping("cart")
public class CartController {

    @Reference
    private TbBrandService tbBrandService;

    public static final String CARTKEY="cartList";//购物车的key

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 获取购物车列表
     * @return
     */
    @RequestMapping("getList")
    public List<Cart> getList(HttpServletRequest request){
        List<Cart> cartList =null;
        try {
            //已经登录
            String loginUser = SecutityUtils.getLoginUser();
            //从redis里边获取到旧的购物车列表
            cartList =(List<Cart>)redisTemplate.opsForHash().get(CARTKEY,loginUser);
        } catch (Exception e) {
            cartList = selectCartList(request);
        }
        return cartList;
    }
    //从cookie查询购物车列表
    private List<Cart> selectCartList(HttpServletRequest request) {
        //1、获取到cookie里边旧的购物车列表
        String jsonList = CookieUtil.getCookieValueByName(request,CARTKEY);
        List<Cart> cartList =null;
        //把旧的购物车列表json转换为List<Cart>
        if(StringUtil.isEmpty(jsonList)){
            cartList= new ArrayList<>();
        } else {
            cartList = JSONObject.parseArray(jsonList, Cart.class);
        }
        return cartList;
    }

    /**
     * cookie=(key=商家id,value=商品列表）
     * @param itemId  商品id
     * @param sellerId  商家id
     * @param num  商品数量
     * @return
     */
    @RequestMapping("addCart")
    public Boolean addCart(HttpServletRequest request, HttpServletResponse response, Long itemId, Integer sellerId, Integer num){
        //1、判断是否登录
        try {
            //已经登录
            String loginUser = SecutityUtils.getLoginUser();
            //从redis里边获取到旧的购物车列表
            List<Cart> cartList =(List<Cart>)redisTemplate.opsForHash().get(CARTKEY,loginUser);
            //把加入的新商品，添加到旧的购物车列表，获取到最新购物车列表
            List<Cart> newcartList = addCart2Cartlist(cartList, itemId, sellerId, num);
            //把新的购物车列表存入redis
            redisTemplate.opsForHash().put(CARTKEY,loginUser,newcartList);
        } catch (Exception e) {
            //未登录
            //1、获取到cookie里边旧的购物车列表
            List<Cart> cartList = selectCartList(request);
            //把加入的新商品，添加到旧的购物车列表，获取到最新购物车列表
            List<Cart> newcartList = addCart2Cartlist(cartList, itemId, sellerId, num);
            //把新的购物车列表转换成json字符串
            String json = JSON.toJSONString(newcartList);
            //把新的购物车列表json字符串，放回到cookie里边
            CookieUtil.addCookie(response,CARTKEY,json);
        }
        return true;
    }

    /**
     * 把传入的商品，加入到原来的购物车列表
     * @param oldcartlist 原购物车
     * @param itemId  商品id
     * @param sellerId 商家id
     * @param num  商品的数量
     * @return
     */
    private List<Cart> addCart2Cartlist(List<Cart> oldcartlist,Long itemId,Integer sellerId,int num){
        //循环旧的购物车列表
        if(oldcartlist !=null && oldcartlist.size()>0){
            boolean isczcar =false;
            for(Cart cart:oldcartlist){
                //先判断，该商家的购物车是否存在
                if(cart.getSellerId().equals(sellerId)){//如果存在该商家的商品列表
                    isczcar=true;
                    List<TbBrand> brandList = cart.getBrandList();//获取商品列表
                    if(brandList != null && brandList.size()>0){ //如果列表存在
                        boolean iscz=false;//定义变量，默认不存在
                        for(TbBrand brand:brandList){
                            if(brand.getId() == itemId){//如果商品列表中，存在该商品
                                iscz=true;//查找到，修改为存在
                                brand.setNum(brand.getNum()+num);
                            }
                        }
                        //循环结束，如果还是false，说明之前列表中不存在，那么把新商品添加到列表中
                        if(!iscz){
                            TbBrand tbBrand = tbBrandService.getById(itemId);//根据商品id查找商品信息
                            tbBrand.setNum(num);//传入商品数量
                            brandList.add(tbBrand);//把商品添加到列表里边
                        }

                    }
                }
            }
            if(!isczcar){  //如果该商家购物车不存在，创建新的商家购物车
                creatnewCart(oldcartlist, itemId, sellerId, num);
            }
        } else{//如果购物车列表都不存在，创建新的商家购物车
            creatnewCart(oldcartlist, itemId, sellerId, num);
        }
        return oldcartlist;
    }
    //创建新的购物车
    private void creatnewCart(List<Cart> oldcartlist, Long itemId, Integer sellerId, int num) {
        Cart cart1 = new Cart();
        cart1.setSellerId(sellerId);
        //根据商家id查找商家
        TType tType = tbBrandService.getTTypeById(sellerId);
        cart1.setSellerName(tType.getName());
        List<TbBrand> brandList=new ArrayList<>();
        TbBrand tbBrand = tbBrandService.getById(itemId);//根据商品id查找商品信息
        tbBrand.setNum(num);//传入商品数量
        brandList.add(tbBrand);//把商品添加到列表里边
        cart1.setBrandList(brandList);

        oldcartlist.add(cart1);//把新的购物车添加到购物车列表
    }
}
